package cn.edu.zsc.rbac.service.array;

import cn.edu.zsc.rbac.domain.dto.BaseDto;
import cn.edu.zsc.rbac.domain.entity.BaseEntity;
import cn.edu.zsc.rbac.domain.vo.BaseVo;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.service.IBaseService;

import java.util.Arrays;
@Deprecated
abstract class BaseService<Entity extends BaseEntity, Dto extends BaseDto, Vo extends BaseVo> implements IBaseService<Entity, Dto> {
    @Override
    public boolean existsById(int id) {
        return id >= 1 && id < idCounter && data[id] != null;
    }

    @Override
    public Entity findById(int id) {
        if (existsById(id)) {
            return data[id];
        }
        return null;
    }

    @Override
    public Result list() {
        // 注意：不再创建局部变量 temp，⽽采⽤成员变量 temp
        int length = 0;
        // 遍历数据源中的所有数据，跳过空数据并将有效的实体对象转换为视图对象
        for (int i = 1; i < idCounter; i++) {
            // 如果数据存在
            if (data[i] != null) {
                // 将实体对象转换为视图对象，并存⼊临时数组
                temp[length++] = convertToVo(data[i]);
            }
        }
        // 返回成功结果，并返回临时数组的有效部分
        return Result.success("查询成功", Arrays.copyOf(temp, length));
    }

    @Override
    public Result create(Dto dto) {
        // 检查当前存储的数量是否超过最⼤容量
        if (idCounter > DATA_SIZE) {
            // 如果超过最⼤容量，返回失败结果
            return Result.failure("创建失败，超出存储容量");
        }
        // 使⽤传⼊的dto对象和id值，创建新的实体对象，
        Entity entity = createEntity(dto, idCounter++);
        // 将新实体对象存储到数据数组中
        data[entity.getId()] = entity;
        // 返回成功结果
        return Result.success("创建成功", null);
    }

    @Override
    public Result update(Dto dto, int id) {
        // 检查提供的 ID 是否有效：ID ⼩于 1，ID 超出有效范围，或者该 ID 对应的数据为空
        if (!existsById(id)) {
            // 如果 ID ⽆效，返回更新失败的结果
            return Result.failure("更新失败，不存在该数据");
        }
        // 获取指定 ID 的实体对象
        Entity entity = data[id];
        // 使⽤传⼊的dto对象，更新实体对象
        updateEntity(dto, entity);
        // 返回更新成功的结果
        return Result.success("更新成功", null);
    }
    /**
     * 实体对象存储量
     */
    static final int DATA_SIZE = 100;
    /**
     * 实体对象存储数组
     */
    Entity[] data;
    /**
     * ID 计数器
     */
    int idCounter = 1;
    /**
     * 视图对象临时数组
     */
    Vo[] temp;
    abstract Vo convertToVo(Entity entity);
    abstract Entity createEntity(Dto dto, int id);
    abstract void updateEntity(Dto dto, Entity entity);
}
